//package com.xzll.common.config;
//
//import com.fasterxml.jackson.databind.ObjectMapper;
//import io.lettuce.core.RedisClient;
//import io.lettuce.core.RedisURI;
//import io.lettuce.core.api.StatefulRedisConnection;
//import lombok.Getter;
//import lombok.Setter;
//import org.apache.commons.lang3.StringUtils;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.boot.context.properties.ConfigurationProperties;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.context.annotation.Primary;
//import org.springframework.data.redis.connection.*;
//import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
//import org.springframework.data.redis.serializer.StringRedisSerializer;
//
//import java.util.*;
//
///**
// * @Author: hzz
// * @Date: 2024/5/30 13:27:55
// * @Description: 哨兵模式，本机mac远程连接的话 不好使，无法修改哨兵返回的redis ip 所以本机启动项目时 使用另一个类 redisConfig即可，部署到服务上时  可以连哨兵集群
// */
//@Setter
//@Getter
//@Configuration
//@ConfigurationProperties(prefix = "spring.redis")
//public class RedisConfigSentinel {
//
//
//    private Sentinel sentinel = new Sentinel();
//
//    @Setter
//    @Getter
//    public class Sentinel {
//        private String nodes;
//        private String master;
//    }
//
//    @Bean("redisTemplate")
//    @Primary
//    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory, ObjectMapper objectMapper) {
//
//        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
//        redisTemplate.setConnectionFactory(redisConnectionFactory);
//
//        //设置key 序列化的方式
//        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
//        redisTemplate.setKeySerializer(stringRedisSerializer);
//
//        //设置value 序列化的方式
//        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
//        serializer.setObjectMapper(objectMapper);
//
//        redisTemplate.setValueSerializer(serializer);
//
//        //设置 hash key value 序列化的方式
//        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
//        redisTemplate.setHashValueSerializer(new StringRedisSerializer());
//
//        // 禁用默认序列化器
//        redisTemplate.setEnableDefaultSerializer(false);
//        redisTemplate.setDefaultSerializer(null);
//
//        redisTemplate.afterPropertiesSet();
//        return redisTemplate;
//    }
//
//
//    @Bean(name = "secondaryRedisTemplate")
//    public RedisTemplate<String, Object> secondaryRedisTemplate(RedisConnectionFactory connectionFactory) {
//        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
//        redisTemplate.setConnectionFactory(connectionFactory);
//        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
//        redisTemplate.setKeySerializer(stringRedisSerializer);
//        redisTemplate.setHashKeySerializer(stringRedisSerializer);
//        Jackson2JsonRedisSerializer<?> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
//        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
//        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
//        redisTemplate.afterPropertiesSet();
//        return redisTemplate;
//    }
//
//
//    //-------------------------------------尝试修改哨兵返回的redis主机ip 但是不成功，故放弃，本机使用单机模式连接redis吧
//
//
////    /**
////     * 获取哨兵的地址和端口
////     *
////     * @return
////     */
////    private Set<String> getSentinels() {
////        Set<String> redisNodes = new HashSet<>();
////        // 分割节点字符串
////        String[] nodes = sentinel.nodes.split(",");
////        // 遍历每个节点并创建 RedisNode 对象
////        for (String node : nodes) {
////            redisNodes.add(node);
////        }
////        return redisNodes;
////    }
//
////
////    /**
////     * 正在检查是否存在 SSH 进程...
////     * 检测到 SSH 进程 (PID: 8434)，正在终止...
////     * SSH 进程已终止。
////     * 正在创建主连接...
////     * root@9xxxxxxxx's password:
////     * 主连接已创建成功。
////     * 正在打开 Redis 哨兵隧道 (26379)...
////     * Redis 哨兵隧道 (26379) 已成功打开。
////     * COMMAND  PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
////     * ssh     8703  hzz    8u  IPv6 0xfb55eea3aa52ad3f      0t0  TCP localhost:26379 (LISTEN)
////     * ssh     8703  hzz    9u  IPv4 0xfb55eea3a386bf77      0t0  TCP localhost:26379 (LISTEN)
////     * <p>
////     * 正在打开 Redis 哨兵隧道 (36379)...
////     * Redis 哨兵隧道 (36379) 已成功打开。
////     * COMMAND  PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
////     * ssh     8703  hzz   10u  IPv6 0xfb55eea3aa52b9ff      0t0  TCP localhost:36379 (LISTEN)
////     * ssh     8703  hzz   11u  IPv4 0xfb55eea3a978ac67      0t0  TCP localhost:36379 (LISTEN)
////     * <p>
////     * 正在打开 Redis 哨兵隧道 (46379)...
////     * Redis 哨兵隧道 (46379) 已成功打开。
////     * COMMAND  PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
////     * ssh     8703  hzz   12u  IPv6 0xfb55eea3aa52c05f      0t0  TCP localhost:46379 (LISTEN)
////     * ssh     8703  hzz   13u  IPv4 0xfb55eea3a8e8f817      0t0  TCP localhost:46379 (LISTEN)
////     *
////     * @return
////     */
//////    @Bean
//////    @Primary
//////    public LettuceConnectionFactory redisConnectionFactory() {
//////        // 创建哨兵配置
//////        RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration(masterName, getSentinels());
//////        // 创建连接工厂
//////        LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(sentinelConfig);
//////        //验证工厂中配置的属性是否正确。如果有任何配置不正确或缺失，该方法将抛出异常
//////        lettuceConnectionFactory.afterPropertiesSet();
//////
//////        // 获取当前主节点信息 并替换主节点的 IP 地址为本地（127.0.0.1）地址，原因是已经做了端口转发
////////        RedisNode masterNode = sentinelConfig.getSentinels().stream()
////////                .findFirst() // 这里假设我们使用第一个哨兵的配置
////////                .map(redisNode -> new RedisNode("127.0.0.1", redisNode.getPort()))
////////                .orElseThrow(() -> new IllegalArgumentException("No sentinel nodes found"));
//////
//////        // 替换主节点的 IP 为本地地址
////////        sentinelConfig.getMaster()
////////        RedisNode newMasterNode = new RedisNode(localHost, masterNode.getPort());
////////
////////        // 设置替换后的主节点
////////        sentinelConfig.setMaster(masterNode);
////////        lettuceConnectionFactory.initConnection();
//////
//////
//////        RedisURI redisURI = RedisURI.builder()
//////                .withHost("127.0.0.1")  // 强制使用本地地址
//////                .withPort(6379)          // 使用 Redis 端口
//////                .build();
//////
//////        LettuceConnectionFactory factory = new LettuceConnectionFactory(redisURI);
//////        factory.setValidateConnection(true);  // 校验连接是否有效
//////
//////        return lettuceConnectionFactory;
//////    }
//
//}
